#通过权限控制按钮
from django.http import QueryDict
from django.template import Library
from django.conf import settings
from django.urls import reverse
from django.utils.safestring import mark_safe

register = Library()

#权限判断
def check_permission(request, name):
    # 1：获取登录用户的角色
    role = request.nb_user.role
    # 2：获取角色的权限字段
    permission_dict = settings.NB_PERMISSION[role]
    if name in permission_dict:
        return True
    #判断访问的url是不是在公共部分
    if name in settings.NB_PERMISSION_PUBLIC:
        return True

    return False

#通过权限控制添加按钮 【name：按钮url的name属性  *args,**kwargs:接收参数用于反向生产url】
@register.simple_tag
def add_permission(request,name,*args,**kwargs):
    # print(request,name,args,kwargs)
    #3：判断是否有添加按钮权限（判断添加按钮对应的url路径name属性即可）
    if not check_permission(request,name):
        #4:无权限返回空
        return ""
    #5：有权限返回标签，通过name反向生成url
    '''
    反向生成url方法
    reverse("url的name参数") #不带参数的url反向生成
    reverse("url名字",kwargs={"pk":123}) #带参数 customer/reset/<int:pk>/
    reverse("url名字",args=(111,) # policy/(\d+) 正则url反向生成
    '''
    # args=args,kwargs=kwargs 后续有参数直接输入
    url = reverse(name,args=args,kwargs=kwargs)
    # 6生成htmld代码加入url
    tpl = f"""
    <a href="{url}" class="btn btn-success">
            <span class="glyphicon glyphicon-plus-sign"></span>
            新建
    </a>
    """
    # mark_safe处理html显示为字符串问题 （防xss攻击机制）
    return mark_safe(tpl)


#通过权限控制编辑按钮
@register.simple_tag
def edit_permission(request,name,*args,**kwargs):
    # 3：判断是否有添加按钮权限（判断添加按钮对应的url路径name属性即可）
    if not check_permission(request, name):
        # 4:无权限返回空
        return ""
    #5：有权限返回标签，通过name反向生成url
    url = reverse(name,args=args,kwargs=kwargs)
    #5.1 优化：修改数据后跳转回之前的界面
    p = request.GET.urlencode() #获取跳转之前的url的get参数
    # 如果带了参数
    if p:
        new_query_dict = QueryDict(mutable=True)  # 直接修改源url
        new_query_dict['_filter'] = p  # 添加一个_filter参数 把参数传入
        data = new_query_dict.urlencode()  # 把url ？后面的get参数  _filter=get参数 自动转译
        # 6生成htmld代码加入url 并携带之前转译的页码参数
        tpl = f"""
            <a href="{url}?{data}" class="btn btn-primary btn-xs">编辑</a>
            <span>|</span>
           """
        # mark_safe处理html显示为字符串问题 （防xss攻击机制）
        return mark_safe(tpl)
    else:
        tpl = f"""
                   <a href="{url}" class="btn btn-primary btn-xs">编辑</a>
                   <span>|</span>
                  """
        # mark_safe处理html显示为字符串问题 （防xss攻击机制）
        return mark_safe(tpl)


#通过权限控制删除按钮 （客户管理界面  ajax删除）
@register.simple_tag
def delete_permission(request,name,*args,**kwargs):
    # 3：判断是否有添加按钮权限（判断添加按钮对应的url路径name属性即可）
    if not check_permission(request, name):
        # 4:无权限返回空
        return ""
    # 6生成htmld代码加入url
    pk = kwargs.get('pk')
    tpl = f"""
       <a cid="{pk}" class="btn btn-danger btn-xs btn-delete">删除</a>
       """
    # mark_safe处理html显示为字符串问题 （防xss攻击机制）
    return mark_safe(tpl)

# 在HTML通过IF判断<td>下的删除、编辑整体是否存在
@register.filter
def has_permission(request, others):
    #拆分字符串
    name_list = others.split(',')
    # 循环判断是否存在
    for name in name_list:
        status = check_permission(request, name)
        if status:
            return True
    return False


#用于级别管理界面的非ajax删除，直接删除 需要加url
@register.simple_tag
def delete_url_permission(request, name, *args, **kwargs):
    # 4.无权限，返回空
    if not check_permission(request, name):
        return ""
    # 5.有权限，通过name反向生成URL
    url = reverse(name, args=args, kwargs=kwargs)
    tpl = f"""
    <a href="{url}" class="btn btn-danger btn-xs btn-delete">删除</a>
    """
    return mark_safe(tpl)
